package com.central.apps.handler.cronTask;



import com.central.app.service.HandlerService;
import com.central.apps.entity.BlMessage;
import com.central.apps.service.AppCustomService;
import com.central.apps.service.MessageService;
import lombok.extern.apachecommons.CommonsLog;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 定时任务
 */
@Component
@Configuration
@EnableScheduling
@CommonsLog
public class SaleReplenishmentTask {

    @Autowired
    private HandlerService handlerService;
    @Autowired
    private MessageService messageService;

    //巡点检工单
    //格式: 秒 分 时 日 月 星期 年
//    @Scheduled(cron="0 00 23 * * ?")
    public void inspectionTimeTask() throws Exception {
        log.info("--------------开始检查物料是否要补货---------------");
        List<Map<String, Object>> bySql = handlerService.findBySql("select itemnum,loweststock,securitystock,description from gq_item");
        if(CollectionUtils.isNotEmpty(bySql)){
            for (Map<String, Object> map : bySql) {
                String itemnum = MapUtils.getString(map, "itemnum");
                String loweststock = MapUtils.getString(map, "loweststock");//最低库余量
                String securitystock = MapUtils.getString(map, "securitystock");//安全库余量
                String description = MapUtils.getString(map, "description");//物料描述
                List<Map<String, Object>> bySql1 = handlerService.findBySql("SELECT ROUND(SUM(curbaltotal),2) as sum from gq_inventory where itemnum = '" + itemnum + "'");
                Map<String, Object> map1 = bySql1.get(0);
                String sum = MapUtils.getString(map1, "sum");//现有库余量
                BigDecimal loweststockBig = new BigDecimal(loweststock!=null?loweststock:"0");
                BigDecimal sumBig = new BigDecimal(sum!=null?sum:"0");
                if(sumBig.compareTo(loweststockBig)==-1){
                    List<Map<String, Object>> bySql2 = handlerService.findBySql("SELECT id,nickname,field10,deptcode from sys_user where worknumber = (SELECT userworknumber from sys_role_user where rolecode = (SELECT code from sys_role where name= '一级库补库人员'))");
                    //计算申请采购数量   申请采购数量=安全库存量-现有库存量+在途采购量（已做采购订单，还未做接收）
                    String applyPurchaseNumber = applyPurchaseNumber(itemnum, sum, securitystock);

                    //现有余量小于最低库余量  生成补货物资采购申请单
                    String prnum = createPrApply(itemnum, applyPurchaseNumber, bySql2);

                    //给对应人员发送消息
                    sendMessage(bySql2,description,prnum);
                }
            }
        }

    }
    public String createPrApply(String itemnum,String applyPurchaseNumber,List<Map<String, Object>> bySql) throws Exception {
        //生成采购申请编号
        String prnumnew="CDPR00000001";
        if(CollectionUtils.isNotEmpty(bySql)){
            Map<String, Object> map = bySql.get(0);
            String id = MapUtils.getString(map, "id");//需求人id
            String nickname = MapUtils.getString(map, "nickname");//需求人名
            int field10 = MapUtils.getIntValue(map, "field10");//人员台账id
            String deptcode = MapUtils.getString(map, "deptcode");//部门
            Map<String, Object> prMap = new HashMap<>();
            SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
            SimpleDateFormat datefmt = new SimpleDateFormat("yyyy-MM-dd");
            String format = df.format(new Date());
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(format).append("补库申请");

            prMap.put("prdesc",stringBuilder.toString());
            prMap.put("createuserdesc",nickname);
            prMap.put("createuser",id);
            prMap.put("applyby",field10);
            prMap.put("applytime",datefmt.format(new Date()));
            prMap.put("attribute","无");
            prMap.put("type","1");
            prMap.put("deptcode",deptcode);
            prMap.put("status","新建");

//            List<Map<String, Object>> bySql3 = handlerService.findBySql("SELECT SUBSTR(prnum,5) as prnum from gq_pr ORDER BY prnum desc limit 1");
//            if(CollectionUtils.isNotEmpty(bySql3)){
//                Map<String, Object> map1 = bySql3.get(0);
//                int prnum = MapUtils.getIntValue(map1, "prnum");
//                prnum = prnum+1;
//                String s = prnumFigure(prnum);
//                StringBuilder stringBuilder1 = new StringBuilder();
//                prnumnew = stringBuilder1.append("CDPR"+s).toString();
//                prMap.put("prnum",prnumnew);
//            }
            //生成采购申请编号
            handlerService.addBizNum("prApp","gq_pr",prMap);
            BigInteger prid = (BigInteger)handlerService.insert("gq_pr",prMap);

            //采购物料明细行
            Map<String, Object> prlineMap = new HashMap<>();
            List<Map<String, Object>> bySql1 = handlerService.findBySql("select * from gq_item where itemnum = '" + itemnum + "'");
            if(CollectionUtils.isNotEmpty(bySql1)){
                Map<String, Object> map1 = bySql1.get(0);
                prlineMap.put("itemdesc",MapUtils.getString(map1,"description"));
                prlineMap.put("specifications",MapUtils.getString(map1,"specifications"));
                prlineMap.put("model",MapUtils.getString(map1,"model"));
                prlineMap.put("packform",MapUtils.getString(map1,"packform"));
                prlineMap.put("qualitygrade",MapUtils.getString(map1,"qualitygrade"));
                prlineMap.put("stexecunical",MapUtils.getString(map1,"stexecunical"));
                prlineMap.put("matergrade",MapUtils.getString(map1,"matergrade"));
                prlineMap.put("orderunit",MapUtils.getString(map1,"unit"));
                prlineMap.put("itemid",MapUtils.getString(map1,"id"));
                prlineMap.put("orderqty",applyPurchaseNumber);
                //取物料最新的历史价格
                String unitcost = "0";
                List<Map<String, Object>> bySql2 = handlerService.findBySql("SELECT unitcost from gq_hispricemater where itemnum = '" + itemnum + "' order by createtime desc LIMIT 1");
                if(CollectionUtils.isNotEmpty(bySql2)){
                    Map<String, Object> map2 = bySql2.get(0);
                    unitcost = MapUtils.getString(map2, "unitcost");//最新价格
                }
                prlineMap.put("unitcost",unitcost);
                prlineMap.put("linecost",new BigDecimal(unitcost).multiply(new BigDecimal(applyPurchaseNumber)).toString());
                prlineMap.put("occupnot","否");
                prlineMap.put("urgency","一般");
            }
            prlineMap.put("itemnum",itemnum);
            prlineMap.put("prid",prid.toString());
            prlineMap.put("deptcode",deptcode);
            prlineMap.put("applyby",String.valueOf(field10));
            prlineMap.put("createuser",id);
            prlineMap.put("prnum",prnumnew);
            handlerService.insert("gq_prline",prlineMap);
        }
        return prnumnew;
    }

    public String applyPurchaseNumber(String itemnum,String sum,String securitystock){
        //在途采购量
        List<Map<String, Object>> bySql = handlerService.findBySql("SELECT SUM(unreceivedqty) as count from gq_posline where itemnum = '" + itemnum + "'");
        Map<String, Object> map = bySql.get(0);
        String count = MapUtils.getString(map, "count");//在途采购量
        BigDecimal countBig = new BigDecimal(count);
        BigDecimal sumBig = new BigDecimal(sum);//现有库余量
        BigDecimal securitystockBig = new BigDecimal(securitystock!=null?securitystock:"0");//安全库余量
        return securitystockBig.subtract(sumBig).add(countBig).toString();
    }

    public void sendMessage(List<Map<String, Object>> bySql1,String description,String prnum){
        List<Map<String, Object>> bySql = handlerService.findBySql("select messagenum from gq_message order by messagenum desc limit 1");
        String messagenum = "1001";
        if (CollectionUtils.isNotEmpty(bySql)) {
            Map<String, Object> map = bySql.get(0);
            messagenum = MapUtils.getString(map, "messagenum");
            Integer integer = Integer.valueOf(messagenum);
            int i = integer + 1;
            messagenum = String.valueOf(i);
        }
        if(CollectionUtils.isNotEmpty(bySql1)){
            BlMessage message = new BlMessage();
            message.setRecipient(MapUtils.getString(bySql1.get(0),"id"));
            message.setRecipientname(MapUtils.getString(bySql1.get(0),"nickname"));
            message.setCreatetime(new Date());
            message.setIsshow("未读");
            StringBuilder str = new StringBuilder();
            str.append("物料"+description+",现有库存低于最低库存，已生成补库采购申请"+prnum+"，请及时处理。");
            message.setContent(str.toString());
            message.setTitle("补库物资采购申请");
            message.setMessagenum(messagenum);
            message.setCreateuser(MapUtils.getString(bySql1.get(0),"id"));
            message.setCreateuserdesc(MapUtils.getString(bySql1.get(0),"nickname"));
            message.setStatus("未读");
            message.setVersion("1");
            int res = messageService.addMessage(message);
            System.out.println("添加状态:" + res);
        }
    }

    public String prnumFigure(int figure){
        NumberFormat numberFormat = NumberFormat.getInstance();
        numberFormat.setMaximumIntegerDigits(8);
        numberFormat.setMinimumIntegerDigits(8);
        return numberFormat.format(figure).replaceAll(",","");
    }




}
        /*0 0 10,14,16 * * ? 每天上午10点，下午2点，4点
        0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
        0 0 12 ? * WED 表示每个星期三中午12点
        “0 0 12 * * ?” 每天中午12点触发
        “0 15 10 ? * *” 每天上午10:15触发
        “0 15 10 * * ?” 每天上午10:15触发
        “0 15 10 * * ? *” 每天上午10:15触发
        “0 15 10 * * ? 2005” 2005年的每天上午10:15触发
        “0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
        “0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
        “0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
        “0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
        “0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
        “0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
        “0 15 10 15 * ?” 每月15日上午10:15触发
        “0 15 10 L * ?” 每月最后一日的上午10:15触发
        “0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
        “0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
        “0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发*/

      /*  * 表示所有值. 例如:在分的字段上设置 “*”,表示每一分钟都会触发

                ? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。

                例如:要在每月的10号触发一个操作，但不关心是周几，所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?

                - 表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发。

                , 表示指定多个值，例如在周字段上设置 “MON,WED,FRI” 表示周一，周三和周五触发

                / 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始，每增15秒触发(5,20,35,50)。 在月字段上设置’1/3’所示每月1号开始，每隔三天触发一次。

                L 表示最后的意思。在日字段设置上，表示当月的最后一天(依据当前月份，如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六，相当于"7"或"SAT"。如果在"L"前加上数字，则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"

                W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W"，表示离每月15号最近的那个工作日触发。如果15号正好是周六，则找最近的周五(14号)触发, 如果15号是周未，则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五)，则就在该天触发。如果指定格式为 “1W”,它则表示每月1号往后最近的工作日触发。如果1号正是周六，则将在3号下周一触发。(注，“W"前只能设置具体的数字,不允许区间”-").

                #序号(表示每月的第几个周几)，例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六，则不会触发该配置(用在母亲节和父亲节再合适不过了) ；

                小提示：
                'L’和 'W’可以组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发；
                周字段的设置，若使用英文字母是不区分大小写的，即MON 与mon相同；*/

